package dao;

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import model.Evento;

/**
 *
 * @author juliana_carlos
 *  Classe Evento_imp implementa a classe Evento_int.
 */
public class Evento_imp implements Evento_int {
    /**
     * Strings do Mysql utilizadas para criar, listar, atualizar, deletar e buscar.
     */
   
    /**
     * Comando utilizado para inserir dados na tabela evento.
     */ 
    private final String create = "INSERT INTO tb_evento(data,hora,idesporte,idlocal) VALUES (?,?,?,?)";
    /**
     * Comando utilizado para listar todos os dados da tabela evento.
     */
    private final String read   = "SELECT*FROM tb_evento";
    /**
     * Comando utilizado para atualizar todos os dados da tabela evento.
     */
    private final String update = "UPDATE tb_esporte SET data=?,hora=?,idesporte=?,idlocal=? WHERE idevento=?";
    /**
     * Comando utilizado para deletar os dados da tabela evento através do idevento.
     */
    private final String delete = "DELETE FROM tb_evento WHERE idevento=?";
    /**
     * Comando utilizado para buscar os dados da tabela evento através do data.
     */
    private final String search = "SELECT*FROM tb_evento WHERE data=?";
    /**
     * Variáveis utilizadas na classe.
     */
    private Connection con;
    private PreparedStatement stmt;
    private ArrayList<Evento> espArray;
    private Evento espModelo;
/**
 * Método utilizado para instânciar uma nova conexão.
 */
    public Evento_imp() {
        try {
            con = new ConnectionFactory().getConnection();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
/**
 * Método utilizado para criar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Evento.
 * 
 */
    @Override
    
    public void create(Evento e) {
        try {
            stmt = con.prepareStatement(create);
            stmt.setString(1, e.getData());
            stmt.setString(2, e.getHora());
            stmt.setInt(3, e.getIdesporte());
            stmt.setInt(4, e.getIdlocal());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga inserir o evento.
             */
            JOptionPane.showMessageDialog(null, "Erro ao inserir evento");
        }
    }
/**
 * Método utilizado para listar os dados.
 * @return o Array, utilizado para finalizar o método. 
 */
    @Override
 
    public ArrayList<Evento> read() {
 /**
  * espArray está instânciando um Array.
  */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(read);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Evento();
                espModelo.setIdevento(rs.getInt("idevento"));
                espModelo.setData(rs.getString("data"));
                espModelo.setHora(rs.getString("hora"));
                espModelo.setIdesporte(rs.getInt("idesporte"));
                espModelo.setIdlocal(rs.getInt("idlocal"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga listar o evento.
             */
            JOptionPane.showMessageDialog(null, "Erro ao listar evento\n"+ex.getMessage());
        }
        return espArray;
    }
/**
 * Método utilizado para atualizar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Evento. 
 */
    @Override
    public void update(Evento e) {
        try {
            stmt = con.prepareStatement(update);
            stmt.setInt(1, e.getIdevento());
            stmt.setString(2, e.getData());
            stmt.setString(3, e.getHora());
            stmt.setInt(4, e.getIdesporte());
            stmt.setInt(5, e.getIdlocal());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga atualizar o evento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao atualizar evento");
        }
    }
/**
 * Método utilizado para deletar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Evento. 
 */
    @Override
    public void delete(Evento e) {
        try {
            stmt = con.prepareStatement(delete);
            stmt.setInt(1, e.getIdevento());
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            /**
             * Mensagem de erro, caso não consiga deletar o evento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao deletar evento");
        }
    }
/**
 * Método utilizado para buscar os dados. Sempre que o método receber dados, 
 * ele será recebido através do parâmetro.
 * @param e, nome da variável do tipo Evento. 
 * @return o Array, utilizado para finalizar o método.
 */
    @Override
    public ArrayList<Evento> search(Evento e) {
        /**
         * espArray está instânciando um Array.
         */
        espArray = new ArrayList<>();
        try {
            stmt = con.prepareStatement(search);
            stmt.setString(1, e.getData());
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                espModelo = new Evento();
                espModelo.setIdevento(rs.getInt("idevento"));
                espModelo.setData(rs.getString("data"));
                espModelo.setHora(rs.getString("hora"));
                espModelo.setIdesporte(rs.getInt("idesporte"));
                espModelo.setIdlocal(rs.getInt("idlocal"));
                espArray.add(espModelo);
            }
        } catch (SQLException ex) {

            /**
             *  Mensagem de erro, caso não consiga listar o evento. 
             */
            JOptionPane.showMessageDialog(null, "Erro ao buscar evento");

        }
        return espArray;
    }
}
